﻿using MSTSCLib;
using SharpViewCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Net;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using RDPCOMAPILib;
using System.Linq;
using System.Threading;
using SharpViewCore.EventArgs;
using SharpViewCore.Network;
using System.Diagnostics;

namespace SharpView
{
    public partial class Form1: Form
    {
        RemoteServer remoteServer1;
        [DllImport ("Gdi32.dll" , EntryPoint = "CreateRoundRectRgn")]
        private static extern IntPtr CreateRoundRectRgn
    (
        int nLeftRect , // x-coordinate of upper-left corner
        int nTopRect , // y-coordinate of upper-left corner
        int nRightRect , // x-coordinate of lower-right corner
        int nBottomRect , // y-coordinate of lower-right corner
        int nWidthEllipse , // height of ellipse
        int nHeightEllipse // width of ellipse
     );

        [DllImport ("dwmapi.dll")]
        public static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd , ref MARGINS pMarInset );

        [DllImport ("dwmapi.dll")]
        public static extern int DwmSetWindowAttribute( IntPtr hwnd , int attr , ref int attrValue , int attrSize );

        [DllImport ("dwmapi.dll")]
        public static extern int DwmIsCompositionEnabled( ref int pfEnabled );

        private bool m_aeroEnabled;                     // variables for box shadow
        private const int CS_DROPSHADOW = 0x00020000;
        private const int WM_NCPAINT = 0x0085;
        private const int WM_ACTIVATEAPP = 0x001C;

        public struct MARGINS                           // struct for box shadow
        {
            public int leftWidth;
            public int rightWidth;
            public int topHeight;
            public int bottomHeight;
        }

        private const int WM_NCHITTEST = 0x84;          // variables for dragging the form
        private const int HTCLIENT = 0x1;
        private const int HTCAPTION = 0x2;

        private bool CheckAeroEnabled()
        {
            if ( Environment.OSVersion.Version.Major>=6 )
            {
                int enabled = 0;
                DwmIsCompositionEnabled (ref enabled);
                return ( enabled==1 ) ? true : false;
            }
            return false;
        }
        protected override CreateParams CreateParams
        {
            get
            {
                m_aeroEnabled=CheckAeroEnabled ();

                CreateParams cp = base.CreateParams;
                    cp.ClassStyle|=CS_DROPSHADOW;

                return cp;
            }
        }
        protected override void WndProc( ref Message m )
        {
            switch ( m.Msg )
            {
                case WM_NCPAINT:                        // box shadow
                        var v = 2;
                        DwmSetWindowAttribute (this.Handle , 2 , ref v , 4);
                        MARGINS margins = new MARGINS ()
                        {
                            bottomHeight=1 ,
                            leftWidth=1 ,
                            rightWidth=1 ,
                            topHeight=1
                        };
                        DwmExtendFrameIntoClientArea (this.Handle , ref margins);
                    break;
                default:
                    break;
            }
            base.WndProc (ref m);

            if ( m.Msg==WM_NCHITTEST&&(int)m.Result==HTCLIENT )     // drag the form
                m.Result=(IntPtr)HTCAPTION;

        }


        public Form1()
        {
            DoubleBuffered=true;
            ResizeRedraw=true;
            m_aeroEnabled=false;
            InitializeComponent ();
            remoteServer1=new RemoteServer ();

     

            if ( string.IsNullOrWhiteSpace (Properties.Settings.Default.personalpassword) )
                ;
            else
            {
                PersonalPasswordEntry entry = new PersonalPasswordEntry ();
                this.Hide ();
                if ( entry.ShowDialog ()==DialogResult.OK&&entry.PasswordEntered )
                {
                    this.Show ();
                }
                else
                    Close ();
            }


        }

        private void panel1_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (ColorTranslator.FromHtml ("#0052A5")) , new Rectangle (
                0 , panel1.Height-1 , panel1.Width-1 , 1));
        }

        private bool connectionAvailable;

        public bool ConnectionIsActive
        {
            get { return connectionAvailable; }
            set
            {
                connectionAvailable=value; panel11.Invalidate ();
                if ( value )
                {
                    label6.ForeColor=Color.Gray;
                    label6.Text="Ready to connect (Secure connection)";
                }
                else
                {
                    label6.ForeColor=Color.Gray;
                    label6.Text="Not Ready, no internet connection";
                }
            }
        }

        Remote_session session;
        private static Random random = new Random ();
        public static string RandomString( int length )
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string (Enumerable.Repeat (chars , length)
              .Select (s => s[ random.Next (s.Length) ]).ToArray ());
        }
        private void Form1_Load( object sender , EventArgs e )
        {
       
        }
        public RDPSession currentSession = null;
        public void createSession()
        {
            currentSession=new RDPSession ();
        }

        public void Connect( RDPSession session )
        {
            session.OnAttendeeConnected+=Incoming;
            session.Open ();
        }

        public void Disconnect( RDPSession session )
        {
            session.Close ();
        }

        public string getConnectionString( RDPSession session , String authString ,
            string group , string password , int clientLimit )
        {
            IRDPSRAPIInvitation invitation =
                session.Invitations.CreateInvitation
                (authString , group , password , clientLimit);
         
            return invitation.ConnectionString;
        }

        private void Incoming( object Guest )
        {
            IRDPSRAPIAttendee MyGuest = (IRDPSRAPIAttendee)Guest;
            currentSession.VirtualChannelManager.CreateVirtualChannel (Environment.CurrentDirectory , CHANNEL_PRIORITY.CHANNEL_PRIORITY_MED , 0x2113F);
            MyGuest.ControlLevel=CTRL_LEVEL.CTRL_LEVEL_MAX;
            RDPSRAPITcpConnectionInfo info = (RDPSRAPITcpConnectionInfo)MyGuest.ConnectivityInfo;
          
        }


        private void panel10_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (ColorTranslator.FromHtml ("#B7DBFF")) , new Rectangle (
               0 , 0 , panel10.Width-1 , 1));
        }

        private void panel11_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            if ( ConnectionIsActive )
            {
                e.Graphics.FillEllipse (new SolidBrush (ColorTranslator.FromHtml ("#93E000")) , new Rectangle (5 , 5 , 9 , 9));
                e.Graphics.DrawEllipse (new Pen (ColorTranslator.FromHtml ("#81C204")) , new Rectangle (5 , 5 , 9 , 9));
            }
            else
            {
                e.Graphics.FillEllipse (new SolidBrush (Color.Red) , new Rectangle (5 , 5 , 9 , 9));
                e.Graphics.DrawEllipse (new Pen (ColorTranslator.FromHtml ("#e3e3e3")) , new Rectangle (5 , 5 , 9 , 9));
            }
        }

        private void panel2_Paint( object sender , PaintEventArgs e )
        {
        }

        private void panel4_Paint( object sender , PaintEventArgs e )
        {
        }

        private void timer1_Tick( object sender , EventArgs e )
        {
            if ( session!=null )
                if ( session.Visible==true )
                {
                    label6.Text="Session in progress..";
                }
                else
                {
                    var network = NetworkState.Get ();
                    ConnectionIsActive=network.IsConnected;
                }
            else
            {
                var network = NetworkState.Get ();
                ConnectionIsActive=network.IsConnected;
            }

            panel11.Invalidate ();
            panel11.Update ();
        }

        private void panel6_Paint( object sender , PaintEventArgs e )
        {
        }

        private void textBox2_TextChanged( object sender , EventArgs e )
        {
        }

        private void button2_Click( object sender , EventArgs e )
        {
            Close ();
        }

        private void button1_Click( object sender , EventArgs e )
        {

            
        }

        private void button3_Click( object sender , EventArgs e )
        {

            textBox4.Text=Environment.MachineName;
            //textBox2.Text=Environment.UserName;
        }

        private bool settings = true;

        private void button4_Click( object sender , EventArgs e )
        {
            Properties.Settings.Default.personalpassword=textBox21.Text;
            Properties.Settings.Default.personalpasswordHint=textBox25.Text;
            Properties.Settings.Default.masterpassword=textBox29.Text;
            Properties.Settings.Default.Save ();
            panel42.Visible=false;
            panel41.Visible=true;
            panel31.Visible=false;
            button4.BackColor=button4.FlatAppearance.MouseOverBackColor;
            button3.BackColor=Color.Transparent;
            button4.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Bold);
            button3.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            button6.BackColor=Color.Transparent;
            button6.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            //settings=!settings;

            //if ( settings )
            //{
            //    this.Size=new Size (594 , 420);
            //    Properties.Settings.Default.personalpassword=textBox21.Text;
            //    Properties.Settings.Default.personalpasswordHint=textBox25.Text;
            //    Properties.Settings.Default.Save ();
            //}
            //else
            //{
            //    this.Size=new Size (594 , 672);
            //}
            var network = NetworkState.Get ();
            ConnectionIsActive=network.IsConnected;
            this.Refresh ();
            timer1.Start ();
            //this.Height=372;
        }

        private void label3_Click( object sender , EventArgs e )
        {
        }

        private void label7_Click( object sender , EventArgs e )
        {
        }

        private void label8_Click( object sender , EventArgs e )
        {
        }

        private void label4_Click( object sender , EventArgs e )
        {
        }

        private void label5_Click( object sender , EventArgs e )
        {
        }

        private void label16_Click( object sender , EventArgs e )
        {
        }

        private void label11_Click( object sender , EventArgs e )
        {
        }

        private void label12_Click( object sender , EventArgs e )
        {
        }

        private void menuStrip1_ItemClicked( object sender , ToolStripItemClickedEventArgs e )
        {
            
        }

        private void button3_Click_1( object sender , EventArgs e )
        {
            //contextMenu1.Show (button3, 0, button3.Height);
        }

        private void label20_Click( object sender , EventArgs e )
        {

        }

        private void label21_Click( object sender , EventArgs e )
        {

        }

        private void label22_Click( object sender , EventArgs e )
        {

        }

        private void label23_Click( object sender , EventArgs e )
        {

        }

        private void button3_Click_2( object sender , EventArgs e )
        {
            panel42.Visible=true;
            panel41.Visible=false;
            panel31.Visible=false;
            button4.BackColor=Color.Transparent;
            button3.BackColor=button4.FlatAppearance.MouseOverBackColor;
            button4.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            button3.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Bold);
            button6.BackColor=Color.Transparent;
            button6.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            label6.Text="Waiting user settings...";
            timer1.Stop ();
           // this.Height=536;
        }

        private void panel14_Paint( object sender , PaintEventArgs e )
        {

        }

 
        private void panel13_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (222 , 222 , 222)) ,
       new Rectangle (panel13.Width-1 , 0 , 1 , panel13.Height-1));

            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel13.Width-1 , panel13.Height));
        }


        private void panel7_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel7.Width-1 , panel7.Height));
        }

        private void textBox9_TextChanged( object sender , EventArgs e )
        {

        
        }

        

        private void panel37_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (233 , 233 , 233)) , new Rectangle (
 panel37.Width-1 , 0 , 1 , panel37.Height-1));
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel37.Width-1 , panel37.Height));
        }

        private void panel40_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel40.Width-1 , panel40.Height-1));
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (233 , 233 , 233)) , new Rectangle (
 panel40.Width-1 , 0 , 1 , panel40.Height-1));
        }

        private void Form1_StyleChanged( object sender , EventArgs e )
        {

        }

        private void Form1_Shown( object sender , EventArgs e )
        {
            try
            {
                label6.Text="Creating local session server, for local remote connection..";

                this.Text="SharpView";
                //contextMenuStrip1.Renderer=new ToolStripRenderer ();
                textBox21.Text=Properties.Settings.Default.personalpassword;
                var network = NetworkState.Get ();
                label6.Text="Initializing remote session for ("+network.NetworkAddress+")";
                textBox29.Text=Properties.Settings.Default.masterpassword;
                if ( Properties.Settings.Default.masterpassword != "-")
                {
                    var password = Properties.Settings.Default.masterpassword;
                    remoteServer1.Create (password);
                    textBox27.Text=password;
                }
                else
                {
                    var password = RandomString (16);
                    remoteServer1.IncomingConnection+=RemoteServer1_IncomingConnection;
                    remoteServer1.Create (password);
                    textBox27.Text=password;
                    textBox210.Text=new Random ().Next (0 , 6666).ToString ("0000");
                }

                textConnectionString.Text=remoteServer1.DesktopInvitation.ConnectionString;
                ConnectionIsActive=network.IsConnected;
                textBox24.Text=network.NetworkAddress;
            }
            catch ( Exception ) { MessageBox.Show ("Another session is already open, therefore the id, and password, will stay the same, as on the other window."); var network = NetworkState.Get ();  ConnectionIsActive=network.IsConnected; }
        }

        private void RemoteServer1_IncomingConnection(RemoteServerIncomingConnectionEventArgs eventArgs )
        {
            ConnectionPane pane=new ConnectionPane (null , eventArgs.Info.PeerIP , "");
            pane.Location=new Point (Screen.PrimaryScreen.Bounds.Width-pane.Width-10 , Screen.PrimaryScreen.Bounds.Height/2-10);
            pane.Show ();
        }

        private void button5_Click( object sender , EventArgs e )
        {
          
        }
        //<E><A KH="1KX6qp2sLDv5hd1+L0pp91S0rjU=" ID="Daves-Dell"/><C><T ID="1" SID="1797323777"><L P="60115" N="fe80::cc9e:93db:edc3:2795%14"/><L P="60116" N="fe80::cc32:928:1fea:4390%15"/><L P="60117" N="fe80::cd13:41fb:71f4:3e7c%17"/><L P="60118" N="fe80::9492:ec4f:f3e2:fe98%11"/><L P="60119" N="169.254.39.149"/><L P="60120" N="192.168.134.1"/><L P="60121" N="192.168.248.1"/><L P="60122" N="192.168.1.21"/></T></C></E>
        private void button5_Click_1( object sender , EventArgs e )
        {
            //session = new Remote_session (Environment.UserName , textBox3.Text , 8080 , Environment.UserName , Environment.UserDomainName ,
            //                      new SharpViewCore.AxDesktopInfo ()
            //                      {
            //                          DesktopHeight=720 ,
            //                          DesktopWidth=1025 ,
            //                          ColorDepth=32 ,
            //                          FullScreen=0 ,
            //                      });
            //session.Show ();

            session=new SharpView.Remote_session (textConnectionString.Text , Environment.UserDomainName , textBox27.Text, this);
            session.Show ();
        }

        private void checkBox1_Click( object sender , EventArgs e )
        {

        }



        private void label18_Click( object sender , EventArgs e )
        {

        }

        private void panel8_Paint( object sender , PaintEventArgs e )
        {

        }

        private void panel5_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (222,222,222)),
                new Rectangle (panel5.Width-1 , 0 , 1 , panel5.Height-1));
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel5.Width-1 , panel5.Height));
        }

        private void pictureBox2_Click( object sender , EventArgs e )
        {
            textBox27.Text=RandomString (8);
        }

        private void textBox4_TextChanged( object sender , EventArgs e )
        {

        }

        private void remoteServer1_IncomingConnection( SharpViewCore.EventArgs.RemoteServerIncomingConnectionEventArgs eventArgs )
        {
            Remote_session.ActiveForm.Text=eventArgs.Info.PeerIP+" in progress";
            label6.Text="Awaiting connection.. ( "+eventArgs.Info.PeerIP.ToString ()+";"+eventArgs.Info.Protocol.ToString ()+")";
        }

        private void panel3_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel3.Width-1 , panel3.Height-1));
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (222 , 222 , 222)),
    new Rectangle (panel3.Width-1 , 0 , 1 , panel3.Height-1));
        }

        private void panel8_Paint_1( object sender , PaintEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (222 , 222 , 222)) ,
new Rectangle (panel8.Width-1 , 0 , 1 , panel8.Height-1));
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel8.Width-1 , panel8.Height-1));
        }

        private void backgroundWorker1_DoWork( object sender , DoWorkEventArgs e )
        {
         
        }

        private void checkBox1_Click_1( object sender , EventArgs e )
        {

        }

        private void button5_Click_2( object sender , EventArgs e )
        {
            button5.Enabled=false;
            label6.Text="Connecting...";
            //try
            //{
            //     session = new Remote_session (textBox2.Text , textBox3.Text , int.Parse (textBox5.Text) , textBox4.Text , textBox1.Text ,
            //        new SharpViewCore.AxDesktopInfo ()
            //        {
            //            DesktopHeight=int.Parse (textBox23.Text) ,
            //            DesktopWidth=int.Parse (textBox22.Text) ,
            //            ColorDepth=int.Parse (comboBox1.Text) ,
            //            FullScreen=int.Parse (textBox24.Text) ,
            //        } , checkBox1.Checked , checkBox2.Checked);
            //    session.Show();
            //}
            //catch ( Exception ex )
            //{
            //    label6.ForeColor=Color.Red;
            //    label6.Text="Unable to connect to server...";
            //}

            if ( textBox28.Text!="" )
            {
                var info2 = new RemoteDesktopInfo2 ()
                {
                    Width=int.Parse (textBox22.Text) ,
                    Height=int.Parse (textBox23.Text) ,
                    ColorDepth=int.Parse (textBox26.Text) ,
                    Fullscreen=this.checkBox1.Checked ,
                    FullscreenText="In Full screen" ,
                };
                Remote_session session = new Remote_session (textBox4.Text , Environment.UserName , textBox28.Text , this ,
                  info2, checkBox2.Checked);
                session.Width=info2.Width;
                session.Height=info2.Height;
                session.Show ();
            }
            button5.Enabled=true;
        }

        private void panel22_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel22.Width-1 , panel22.Height));
        }

        private void panel23_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel23.Width-1 , panel23.Height));
        }

        private void panel4_Paint_1( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1, panel4.Width-1 , panel4.Height+2));
        }

        private void panel2_Paint_1( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel2.Width-1 , panel2.Height-1));
        }

        private void panel12_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel12.Width-1 , panel12.Height));
        }

        private void panel7_Paint_1( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel7.Width-1 , panel7.Height-1));
        }

        private void panel6_Paint_1( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel6.Width-1 , panel6.Height-1));
        }

        private void panel39_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel39.Width-1 , panel39.Height-1));
        }

        private void panel26_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel26.Width-1 , panel26.Height-1));
        }

        private void panel25_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel25.Width-1 , panel25.Height-1));
        }

        private void panel20_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1, panel20.Width-1 , panel20.Height+2));
        }

        private void panel19_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel19.Width-1 , panel19.Height+2));
        }

        private void panel16_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel16.Width-1 , panel16.Height));
        }

        private void panel17_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel17.Width-1 , panel17.Height+1));
        }

        private void panel29_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel29.Width-1 , panel29.Height-1));
        }

        private void panel28_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , 0 , panel28.Width-1 , panel28.Height-1));
        }

        private void button6_Click( object sender , EventArgs e )
        {
            panel42.Visible=false;
            panel41.Visible=false;
            panel31.Visible=true;
            button4.BackColor=Color.Transparent;
            button3.BackColor=Color.Transparent;
            button4.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            button3.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Regular);
            button6.BackColor=button4.FlatAppearance.MouseOverBackColor;
            button6.Font=new Font (button4.Font.Name , button4.Font.Size , FontStyle.Bold);
        }

        private void button7_Click( object sender , EventArgs e )
        {
            Tools tools = new Tools ();
            tools.Show ();
        }

        private void button8_Click( object sender , EventArgs e )
        {
            Close ();
        }

        private void button9_Click( object sender , EventArgs e )
        {
            this.WindowState=FormWindowState.Minimized;
        }

        private void panel33_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel33.Width-1 , panel33.Height+1));
        }

        private void panel34_Paint( object sender , PaintEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb (222 , 222 , 222)) , new Rectangle (0 , -1 , panel34.Width-1 , panel34.Height+1));
        }

        private void textBox24_TextChanged( object sender , EventArgs e )
        {

        }

        private void remoteServer1_Connected( RemoteServerConnectedEventArgs eventArgs )
        {
        }

        private void button9_Click_1( object sender , EventArgs e )
        {
            Process.Start ("SharpViewService.exe" , "-window");
        }
    }

    public class TextBox2: System.Windows.Forms.TextBox
    {
        /// <summary>
        /// Occurs when click2.
        /// </summary>
        public event EventHandler Click2;

        private Panel waterTextBox;

        /// <summary>
        /// Gets or sets the water text.
        /// </summary>
        /// <value>The water text.</value>
        [Category ("Watermark")]
        public string WaterText { get; set; }

        /// <summary>
        /// Gets or sets the color of the water text.
        /// </summary>
        /// <value>The color of the water text.</value>
        [Category ("Watermark")]
        public Color WaterTextColor { get; set; }

        /// <summary>
        /// Gets or sets the water font.
        /// </summary>
        /// <value>The water font.</value>
        [Category ("Watermark")]
        public Font WaterFont { get; set; }

        public TextBox2()
        {
            waterTextBox=new Panel ();
            WaterText="WaterMarkText";
            WaterTextColor=Color.Gray;
            WaterFont=new Font ("Open Sans" , 8);
            waterTextBox.Width=this.Width-2;
            waterTextBox.Location=new Point (2 , 0);
            waterTextBox.Anchor=AnchorStyles.Left|AnchorStyles.Right|AnchorStyles.Bottom|AnchorStyles.Top;
            this.Controls.Add (waterTextBox);
            this.TextChanged+=( object sender , System.EventArgs e ) =>
            {
                if ( string.IsNullOrEmpty (this.Text) )
                {
                    this.Controls.Add (waterTextBox);
                }
                else
                    this.Controls.Remove (waterTextBox);
            };

            waterTextBox.Paint+=( object sender , PaintEventArgs e ) =>
            {
                e.Graphics.DrawString (WaterText , WaterFont , new SolidBrush (WaterTextColor) , new Point (0 , 1));
            };

            waterTextBox.Click+=( object sender , System.EventArgs e ) =>
            {
                this.Focus ();
            };

            waterTextBox.Click+=( object sender , System.EventArgs e ) =>
            {
                EventHandler handle = this.Click2;
                if ( handle!=null )
                    handle (sender , e);
            };
        }
    }

    public class ToolStripRenderer :ToolStripProfessionalRenderer
    {
        protected override void OnRenderMenuItemBackground( ToolStripItemRenderEventArgs e )
        {
            e.Item.ForeColor=Color.Black;
            if ( e.Item.Selected )
            {
                e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (0 , 100 , 200)) , e.Item.Bounds);
                e.Item.ForeColor=Color.White;
            }
            else
            {
                e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (255 , 255 , 255)) , e.Item.Bounds);
                e.Item.ForeColor=Color.Black;
            }
        }

        protected override void OnRenderItemBackground( ToolStripItemRenderEventArgs e )
        {
            e.Item.ForeColor=Color.Black;
            if ( e.Item.Selected )
            {
                e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (0 , 100 , 200)) , e.Item.Bounds);
                e.Item.ForeColor=Color.White;
            }
            else
            {
                e.Graphics.FillRectangle (new SolidBrush (Color.FromArgb (255 , 255 , 255)) , e.Item.Bounds);
                e.Item.ForeColor=Color.Black;
            }
        }

        protected override void OnRenderToolStripBorder( ToolStripRenderEventArgs e )
        {
            e.Graphics.DrawRectangle (new Pen (Color.FromArgb(156 , 156 , 156)) , e.AffectedBounds);
            base.OnRenderToolStripBorder (e);
        }

        protected override void OnRenderToolStripBackground( ToolStripRenderEventArgs e )
        {
            e.Graphics.FillRectangle (new SolidBrush (Color.White) , e.AffectedBounds);
            base.OnRenderToolStripBackground (e);
        }
    }

    public class ContextMenu : ContextMenuStrip
    {
        public ContextMenu()
        {
            this.Renderer=new ToolStripRenderer ();
        }
    }



//------------------
//Creator: aeonhack
//Site: elitevs.net
//Created: 08/02/2011
//Changed: 12/06/2011
//Version: 1.5.4
//------------------

abstract class ThemeContainer154: ContainerControl
    {

        #region " Initialization "

        protected Graphics G;

        protected Bitmap B;
        public ThemeContainer154()
        {
            SetStyle ((ControlStyles)139270 , true);

            _ImageSize=Size.Empty;
            Font=new Font ("Verdana" , 8);

            MeasureBitmap=new Bitmap (1 , 1);
            MeasureGraphics=Graphics.FromImage (MeasureBitmap);

            DrawRadialPath=new GraphicsPath ();

            InvalidateCustimization ();
        }

        protected override sealed void OnHandleCreated( EventArgs e )
        {
            if ( DoneCreation )
                InitializeMessages ();

            InvalidateCustimization ();
            ColorHook ();

            if ( !( _LockWidth==0 ) )
                Width=_LockWidth;
            if ( !( _LockHeight==0 ) )
                Height=_LockHeight;
            if ( !_ControlMode )
                base.Dock=DockStyle.Fill;

            Transparent=_Transparent;
            if ( _Transparent&&_BackColor )
                BackColor=Color.Transparent;

            base.OnHandleCreated (e);
        }

        private bool DoneCreation;
        protected override sealed void OnParentChanged( EventArgs e )
        {
            base.OnParentChanged (e);

            if ( Parent==null )
                return;
            _IsParentForm=Parent is Form;

            if ( !_ControlMode )
            {
                InitializeMessages ();

                if ( _IsParentForm )
                {
                    ParentForm.FormBorderStyle=_BorderStyle;
                    ParentForm.TransparencyKey=_TransparencyKey;

                    if ( !DesignMode )
                    {
                        ParentForm.Shown+=FormShown;
                    }
                }

                Parent.BackColor=BackColor;
            }

            OnCreation ();
            DoneCreation=true;
            InvalidateTimer ();
        }

        #endregion

        private void DoAnimation( bool i )
        {
            OnAnimation ();
            if ( i )
                Invalidate ();
        }

        protected override sealed void OnPaint( PaintEventArgs e )
        {
            if ( Width==0||Height==0 )
                return;

            if ( _Transparent&&_ControlMode )
            {
                PaintHook ();
                e.Graphics.DrawImage (B , 0 , 0);
            }
            else
            {
                G=e.Graphics;
                PaintHook ();
            }
        }

        protected override void OnHandleDestroyed( EventArgs e )
        {
            ThemeShare.RemoveAnimationCallback (DoAnimation);
            base.OnHandleDestroyed (e);
        }

        private bool HasShown;
        private void FormShown( object sender , EventArgs e )
        {
            if ( _ControlMode||HasShown )
                return;

            if ( _StartPosition==FormStartPosition.CenterParent||_StartPosition==FormStartPosition.CenterScreen )
            {
                Rectangle SB = Screen.PrimaryScreen.Bounds;
                Rectangle CB = ParentForm.Bounds;
                ParentForm.Location=new Point (SB.Width/2-CB.Width/2 , SB.Height/2-CB.Width/2);
            }

            HasShown=true;
        }


        #region " Size Handling "

        private Rectangle Frame;
        protected override sealed void OnSizeChanged( EventArgs e )
        {
            if ( _Movable&&!_ControlMode )
            {
                Frame=new Rectangle (7 , 7 , Width-14 , _Header-7);
            }

            InvalidateBitmap ();
            Invalidate ();

            base.OnSizeChanged (e);
        }

        protected override void SetBoundsCore( int x , int y , int width , int height , BoundsSpecified specified )
        {
            if ( !( _LockWidth==0 ) )
                width=_LockWidth;
            if ( !( _LockHeight==0 ) )
                height=_LockHeight;
            base.SetBoundsCore (x , y , width , height , specified);
        }

        #endregion

        #region " State Handling "

        protected MouseState State;
        private void SetState( MouseState current )
        {
            State=current;
            Invalidate ();
        }

        protected override void OnMouseMove( MouseEventArgs e )
        {
            if ( !( _IsParentForm&&ParentForm.WindowState==FormWindowState.Maximized ) )
            {
                if ( _Sizable&&!_ControlMode )
                    InvalidateMouse ();
            }

            base.OnMouseMove (e);
        }

        protected override void OnEnabledChanged( EventArgs e )
        {
            if ( Enabled )
                SetState (MouseState.None);
            else
                SetState (MouseState.Block);
            base.OnEnabledChanged (e);
        }

        protected override void OnMouseEnter( EventArgs e )
        {
            SetState (MouseState.Over);
            base.OnMouseEnter (e);
        }

        protected override void OnMouseUp( MouseEventArgs e )
        {
            SetState (MouseState.Over);
            base.OnMouseUp (e);
        }

        protected override void OnMouseLeave( EventArgs e )
        {
            SetState (MouseState.None);

            if ( GetChildAtPoint (PointToClient (MousePosition))!=null )
            {
                if ( _Sizable&&!_ControlMode )
                {
                    Cursor=Cursors.Default;
                    Previous=0;
                }
            }

            base.OnMouseLeave (e);
        }

        protected override void OnMouseDown( MouseEventArgs e )
        {
            if ( e.Button==System.Windows.Forms.MouseButtons.Left )
                SetState (MouseState.Down);

            if ( !( _IsParentForm&&ParentForm.WindowState==FormWindowState.Maximized||_ControlMode ) )
            {
                if ( _Movable&&Frame.Contains (e.Location) )
                {
                    Capture=false;
                    WM_LMBUTTONDOWN=true;
                    DefWndProc (ref Messages[ 0 ]);
                }
                else if ( _Sizable&&!( Previous==0 ) )
                {
                    Capture=false;
                    WM_LMBUTTONDOWN=true;
                    DefWndProc (ref Messages[ Previous ]);
                }
            }

            base.OnMouseDown (e);
        }

        private bool WM_LMBUTTONDOWN;
        protected override void WndProc( ref Message m )
        {
            base.WndProc (ref m);

            if ( WM_LMBUTTONDOWN&&m.Msg==513 )
            {
                WM_LMBUTTONDOWN=false;

                SetState (MouseState.Over);
                if ( !_SmartBounds )
                    return;

                if ( IsParentMdi )
                {
                    CorrectBounds (new Rectangle (Point.Empty , Parent.Parent.Size));
                }
                else
                {
                    CorrectBounds (Screen.FromControl (Parent).WorkingArea);
                }
            }
        }

        private Point GetIndexPoint;
        private bool B1;
        private bool B2;
        private bool B3;
        private bool B4;
        private int GetIndex()
        {
            GetIndexPoint=PointToClient (MousePosition);
            B1=GetIndexPoint.X<7;
            B2=GetIndexPoint.X>Width-7;
            B3=GetIndexPoint.Y<7;
            B4=GetIndexPoint.Y>Height-7;

            if ( B1&&B3 )
                return 4;
            if ( B1&&B4 )
                return 7;
            if ( B2&&B3 )
                return 5;
            if ( B2&&B4 )
                return 8;
            if ( B1 )
                return 1;
            if ( B2 )
                return 2;
            if ( B3 )
                return 3;
            if ( B4 )
                return 6;
            return 0;
        }

        private int Current;
        private int Previous;
        private void InvalidateMouse()
        {
            Current=GetIndex ();
            if ( Current==Previous )
                return;

            Previous=Current;
            switch ( Previous )
            {
                case 0:
                    Cursor=Cursors.Default;
                    break;
                case 1:
                case 2:
                    Cursor=Cursors.SizeWE;
                    break;
                case 3:
                case 6:
                    Cursor=Cursors.SizeNS;
                    break;
                case 4:
                case 8:
                    Cursor=Cursors.SizeNWSE;
                    break;
                case 5:
                case 7:
                    Cursor=Cursors.SizeNESW;
                    break;
            }
        }

        private Message[] Messages = new Message[ 9 ];
        private void InitializeMessages()
        {
            Messages[ 0 ]=Message.Create (Parent.Handle , 161 , new IntPtr (2) , IntPtr.Zero);
            for ( int I = 1; I<=8; I++ )
            {
                Messages[ I ]=Message.Create (Parent.Handle , 161 , new IntPtr (I+9) , IntPtr.Zero);
            }
        }

        private void CorrectBounds( Rectangle bounds )
        {
            if ( Parent.Width>bounds.Width )
                Parent.Width=bounds.Width;
            if ( Parent.Height>bounds.Height )
                Parent.Height=bounds.Height;

            int X = Parent.Location.X;
            int Y = Parent.Location.Y;

            if ( X<bounds.X )
                X=bounds.X;
            if ( Y<bounds.Y )
                Y=bounds.Y;

            int Width = bounds.X+bounds.Width;
            int Height = bounds.Y+bounds.Height;

            if ( X+Parent.Width>Width )
                X=Width-Parent.Width;
            if ( Y+Parent.Height>Height )
                Y=Height-Parent.Height;

            Parent.Location=new Point (X , Y);
        }

        #endregion


        #region " Base Properties "

        public override DockStyle Dock
        {
            get { return base.Dock; }
            set
            {
                if ( !_ControlMode )
                    return;
                base.Dock=value;
            }
        }

        private bool _BackColor;
        [Category ("Misc")]
        public override Color BackColor
        {
            get { return base.BackColor; }
            set
            {
                if ( value==base.BackColor )
                    return;

                if ( !IsHandleCreated&&_ControlMode&&value==Color.Transparent )
                {
                    _BackColor=true;
                    return;
                }

                base.BackColor=value;
                if ( Parent!=null )
                {
                    if ( !_ControlMode )
                        Parent.BackColor=value;
                    ColorHook ();
                }
            }
        }

        public override Size MinimumSize
        {
            get { return base.MinimumSize; }
            set
            {
                base.MinimumSize=value;
                if ( Parent!=null )
                    Parent.MinimumSize=value;
            }
        }

        public override Size MaximumSize
        {
            get { return base.MaximumSize; }
            set
            {
                base.MaximumSize=value;
                if ( Parent!=null )
                    Parent.MaximumSize=value;
            }
        }

        public override string Text
        {
            get { return base.Text; }
            set
            {
                base.Text=value;
                Invalidate ();
            }
        }

        public override Font Font
        {
            get { return base.Font; }
            set
            {
                base.Font=value;
                Invalidate ();
            }
        }

        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override Color ForeColor
        {
            get { return Color.Empty; }
            set { }
        }
        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override Image BackgroundImage
        {
            get { return null; }
            set { }
        }
        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override ImageLayout BackgroundImageLayout
        {
            get { return ImageLayout.None; }
            set { }
        }

        #endregion

        #region " Public Properties "

        private bool _SmartBounds = true;
        public bool SmartBounds
        {
            get { return _SmartBounds; }
            set { _SmartBounds=value; }
        }

        private bool _Movable = true;
        public bool Movable
        {
            get { return _Movable; }
            set { _Movable=value; }
        }

        private bool _Sizable = true;
        public bool Sizable
        {
            get { return _Sizable; }
            set { _Sizable=value; }
        }

        private Color _TransparencyKey;
        public Color TransparencyKey
        {
            get
            {
                if ( _IsParentForm&&!_ControlMode )
                    return ParentForm.TransparencyKey;
                else
                    return _TransparencyKey;
            }
            set
            {
                if ( value==_TransparencyKey )
                    return;
                _TransparencyKey=value;

                if ( _IsParentForm&&!_ControlMode )
                {
                    ParentForm.TransparencyKey=value;
                    ColorHook ();
                }
            }
        }

        private FormBorderStyle _BorderStyle;
        public FormBorderStyle BorderStyle
        {
            get
            {
                if ( _IsParentForm&&!_ControlMode )
                    return ParentForm.FormBorderStyle;
                else
                    return _BorderStyle;
            }
            set
            {
                _BorderStyle=value;

                if ( _IsParentForm&&!_ControlMode )
                {
                    ParentForm.FormBorderStyle=value;

                    if ( !( value==FormBorderStyle.None ) )
                    {
                        Movable=false;
                        Sizable=false;
                    }
                }
            }
        }

        private FormStartPosition _StartPosition;
        public FormStartPosition StartPosition
        {
            get
            {
                if ( _IsParentForm&&!_ControlMode )
                    return ParentForm.StartPosition;
                else
                    return _StartPosition;
            }
            set
            {
                _StartPosition=value;

                if ( _IsParentForm&&!_ControlMode )
                {
                    ParentForm.StartPosition=value;
                }
            }
        }

        private bool _NoRounding;
        public bool NoRounding
        {
            get { return _NoRounding; }
            set
            {
                _NoRounding=value;
                Invalidate ();
            }
        }

        private Image _Image;
        public Image Image
        {
            get { return _Image; }
            set
            {
                if ( value==null )
                    _ImageSize=Size.Empty;
                else
                    _ImageSize=value.Size;

                _Image=value;
                Invalidate ();
            }
        }

        private Dictionary<string , Color> Items = new Dictionary<string , Color> ();
        public Bloom[] Colors
        {
            get
            {
                List<Bloom> T = new List<Bloom> ();
                Dictionary<string , Color>.Enumerator E = Items.GetEnumerator ();

                while ( E.MoveNext () )
                {
                    T.Add (new Bloom (E.Current.Key , E.Current.Value));
                }

                return T.ToArray ();
            }
            set
            {
                foreach ( Bloom B in value )
                {
                    if ( Items.ContainsKey (B.Name) )
                        Items[ B.Name ]=B.Value;
                }

                InvalidateCustimization ();
                ColorHook ();
                Invalidate ();
            }
        }

        private string _Customization;
        public string Customization
        {
            get { return _Customization; }
            set
            {
                if ( value==_Customization )
                    return;

                byte[] Data = null;
                Bloom[] Items = Colors;

                try
                {
                    Data=Convert.FromBase64String (value);
                    for ( int I = 0; I<=Items.Length-1; I++ )
                    {
                        Items[ I ].Value=Color.FromArgb (BitConverter.ToInt32 (Data , I*4));
                    }
                }
                catch
                {
                    return;
                }

                _Customization=value;

                Colors=Items;
                ColorHook ();
                Invalidate ();
            }
        }

        private bool _Transparent;
        public bool Transparent
        {
            get { return _Transparent; }
            set
            {
                _Transparent=value;
                if ( !( IsHandleCreated||_ControlMode ) )
                    return;

                if ( !value&&!( BackColor.A==255 ) )
                {
                    throw new Exception ("Unable to change value to false while a transparent BackColor is in use.");
                }

                SetStyle (ControlStyles.Opaque , !value);
                SetStyle (ControlStyles.SupportsTransparentBackColor , value);

                InvalidateBitmap ();
                Invalidate ();
            }
        }

        #endregion

        #region " Private Properties "

        private Size _ImageSize;
        protected Size ImageSize
        {
            get { return _ImageSize; }
        }

        private bool _IsParentForm;
        protected bool IsParentForm
        {
            get { return _IsParentForm; }
        }

        protected bool IsParentMdi
        {
            get
            {
                if ( Parent==null )
                    return false;
                return Parent.Parent!=null;
            }
        }

        private int _LockWidth;
        protected int LockWidth
        {
            get { return _LockWidth; }
            set
            {
                _LockWidth=value;
                if ( !( LockWidth==0 )&&IsHandleCreated )
                    Width=LockWidth;
            }
        }

        private int _LockHeight;
        protected int LockHeight
        {
            get { return _LockHeight; }
            set
            {
                _LockHeight=value;
                if ( !( LockHeight==0 )&&IsHandleCreated )
                    Height=LockHeight;
            }
        }

        private int _Header = 24;
        protected int Header
        {
            get { return _Header; }
            set
            {
                _Header=value;

                if ( !_ControlMode )
                {
                    Frame=new Rectangle (7 , 7 , Width-14 , value-7);
                    Invalidate ();
                }
            }
        }

        private bool _ControlMode;
        protected bool ControlMode
        {
            get { return _ControlMode; }
            set
            {
                _ControlMode=value;

                Transparent=_Transparent;
                if ( _Transparent&&_BackColor )
                    BackColor=Color.Transparent;

                InvalidateBitmap ();
                Invalidate ();
            }
        }

        private bool _IsAnimated;
        protected bool IsAnimated
        {
            get { return _IsAnimated; }
            set
            {
                _IsAnimated=value;
                InvalidateTimer ();
            }
        }

        #endregion


        #region " Property Helpers "

        protected Pen GetPen( string name )
        {
            return new Pen (Items[ name ]);
        }
        protected Pen GetPen( string name , float width )
        {
            return new Pen (Items[ name ] , width);
        }

        protected SolidBrush GetBrush( string name )
        {
            return new SolidBrush (Items[ name ]);
        }

        protected Color GetColor( string name )
        {
            return Items[ name ];
        }

        protected void SetColor( string name , Color value )
        {
            if ( Items.ContainsKey (name) )
                Items[ name ]=value;
            else
                Items.Add (name , value);
        }
        protected void SetColor( string name , byte r , byte g , byte b )
        {
            SetColor (name , Color.FromArgb (r , g , b));
        }
        protected void SetColor( string name , byte a , byte r , byte g , byte b )
        {
            SetColor (name , Color.FromArgb (a , r , g , b));
        }
        protected void SetColor( string name , byte a , Color value )
        {
            SetColor (name , Color.FromArgb (a , value));
        }

        private void InvalidateBitmap()
        {
            if ( _Transparent&&_ControlMode )
            {
                if ( Width==0||Height==0 )
                    return;
                B=new Bitmap (Width , Height , PixelFormat.Format32bppPArgb);
                G=Graphics.FromImage (B);
            }
            else
            {
                G=null;
                B=null;
            }
        }

        private void InvalidateCustimization()
        {
            MemoryStream M = new MemoryStream (Items.Count*4);

            foreach ( Bloom B in Colors )
            {
                M.Write (BitConverter.GetBytes (B.Value.ToArgb ()) , 0 , 4);
            }

            M.Close ();
            _Customization=Convert.ToBase64String (M.ToArray ());
        }

        private void InvalidateTimer()
        {
            if ( DesignMode||!DoneCreation )
                return;

            if ( _IsAnimated )
            {
                ThemeShare.AddAnimationCallback (DoAnimation);
            }
            else
            {
                ThemeShare.RemoveAnimationCallback (DoAnimation);
            }
        }

        #endregion


        #region " User Hooks "

        protected abstract void ColorHook();
        protected abstract void PaintHook();

        protected virtual void OnCreation()
        {
        }

        protected virtual void OnAnimation()
        {
        }

        #endregion


        #region " Offset "

        private Rectangle OffsetReturnRectangle;
        protected Rectangle Offset( Rectangle r , int amount )
        {
            OffsetReturnRectangle=new Rectangle (r.X+amount , r.Y+amount , r.Width-( amount*2 ) , r.Height-( amount*2 ));
            return OffsetReturnRectangle;
        }

        private Size OffsetReturnSize;
        protected Size Offset( Size s , int amount )
        {
            OffsetReturnSize=new Size (s.Width+amount , s.Height+amount);
            return OffsetReturnSize;
        }

        private Point OffsetReturnPoint;
        protected Point Offset( Point p , int amount )
        {
            OffsetReturnPoint=new Point (p.X+amount , p.Y+amount);
            return OffsetReturnPoint;
        }

        #endregion

        #region " Center "


        private Point CenterReturn;
        protected Point Center( Rectangle p , Rectangle c )
        {
            CenterReturn=new Point (( p.Width/2-c.Width/2 )+p.X+c.X , ( p.Height/2-c.Height/2 )+p.Y+c.Y);
            return CenterReturn;
        }
        protected Point Center( Rectangle p , Size c )
        {
            CenterReturn=new Point (( p.Width/2-c.Width/2 )+p.X , ( p.Height/2-c.Height/2 )+p.Y);
            return CenterReturn;
        }

        protected Point Center( Rectangle child )
        {
            return Center (Width , Height , child.Width , child.Height);
        }
        protected Point Center( Size child )
        {
            return Center (Width , Height , child.Width , child.Height);
        }
        protected Point Center( int childWidth , int childHeight )
        {
            return Center (Width , Height , childWidth , childHeight);
        }

        protected Point Center( Size p , Size c )
        {
            return Center (p.Width , p.Height , c.Width , c.Height);
        }

        protected Point Center( int pWidth , int pHeight , int cWidth , int cHeight )
        {
            CenterReturn=new Point (pWidth/2-cWidth/2 , pHeight/2-cHeight/2);
            return CenterReturn;
        }

        #endregion

        #region " Measure "

        private Bitmap MeasureBitmap;

        private Graphics MeasureGraphics;
        protected Size Measure()
        {
            lock ( MeasureGraphics )
            {
                return MeasureGraphics.MeasureString (Text , Font , Width).ToSize ();
            }
        }
        protected Size Measure( string text )
        {
            lock ( MeasureGraphics )
            {
                return MeasureGraphics.MeasureString (text , Font , Width).ToSize ();
            }
        }

        #endregion


        #region " DrawPixel "


        private SolidBrush DrawPixelBrush;
        protected void DrawPixel( Color c1 , int x , int y )
        {
            if ( _Transparent )
            {
                B.SetPixel (x , y , c1);
            }
            else
            {
                DrawPixelBrush=new SolidBrush (c1);
                G.FillRectangle (DrawPixelBrush , x , y , 1 , 1);
            }
        }

        #endregion

        #region " DrawCorners "


        private SolidBrush DrawCornersBrush;
        protected void DrawCorners( Color c1 , int offset )
        {
            DrawCorners (c1 , 0 , 0 , Width , Height , offset);
        }
        protected void DrawCorners( Color c1 , Rectangle r1 , int offset )
        {
            DrawCorners (c1 , r1.X , r1.Y , r1.Width , r1.Height , offset);
        }
        protected void DrawCorners( Color c1 , int x , int y , int width , int height , int offset )
        {
            DrawCorners (c1 , x+offset , y+offset , width-( offset*2 ) , height-( offset*2 ));
        }

        protected void DrawCorners( Color c1 )
        {
            DrawCorners (c1 , 0 , 0 , Width , Height);
        }
        protected void DrawCorners( Color c1 , Rectangle r1 )
        {
            DrawCorners (c1 , r1.X , r1.Y , r1.Width , r1.Height);
        }
        protected void DrawCorners( Color c1 , int x , int y , int width , int height )
        {
            if ( _NoRounding )
                return;

            if ( _Transparent )
            {
                B.SetPixel (x , y , c1);
                B.SetPixel (x+( width-1 ) , y , c1);
                B.SetPixel (x , y+( height-1 ) , c1);
                B.SetPixel (x+( width-1 ) , y+( height-1 ) , c1);
            }
            else
            {
                DrawCornersBrush=new SolidBrush (c1);
                G.FillRectangle (DrawCornersBrush , x , y , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x+( width-1 ) , y , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x , y+( height-1 ) , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x+( width-1 ) , y+( height-1 ) , 1 , 1);
            }
        }

        #endregion

        #region " DrawBorders "

        protected void DrawBorders( Pen p1 , int offset )
        {
            DrawBorders (p1 , 0 , 0 , Width , Height , offset);
        }
        protected void DrawBorders( Pen p1 , Rectangle r , int offset )
        {
            DrawBorders (p1 , r.X , r.Y , r.Width , r.Height , offset);
        }
        protected void DrawBorders( Pen p1 , int x , int y , int width , int height , int offset )
        {
            DrawBorders (p1 , x+offset , y+offset , width-( offset*2 ) , height-( offset*2 ));
        }

        protected void DrawBorders( Pen p1 )
        {
            DrawBorders (p1 , 0 , 0 , Width , Height);
        }
        protected void DrawBorders( Pen p1 , Rectangle r )
        {
            DrawBorders (p1 , r.X , r.Y , r.Width , r.Height);
        }
        protected void DrawBorders( Pen p1 , int x , int y , int width , int height )
        {
            G.DrawRectangle (p1 , x , y , width-1 , height-1);
        }

        #endregion

        #region " DrawText "

        private Point DrawTextPoint;

        private Size DrawTextSize;
        protected void DrawText( Brush b1 , HorizontalAlignment a , int x , int y )
        {
            DrawText (b1 , Text , a , x , y);
        }
        protected void DrawText( Brush b1 , string text , HorizontalAlignment a , int x , int y )
        {
            if ( text.Length==0 )
                return;

            DrawTextSize=Measure (text);
            DrawTextPoint=new Point (Width/2-DrawTextSize.Width/2 , Header/2-DrawTextSize.Height/2);

            switch ( a )
            {
                case HorizontalAlignment.Left:
                    G.DrawString (text , Font , b1 , x , DrawTextPoint.Y+y);
                    break;
                case HorizontalAlignment.Center:
                    G.DrawString (text , Font , b1 , DrawTextPoint.X+x , DrawTextPoint.Y+y);
                    break;
                case HorizontalAlignment.Right:
                    G.DrawString (text , Font , b1 , Width-DrawTextSize.Width-x , DrawTextPoint.Y+y);
                    break;
            }
        }

        protected void DrawText( Brush b1 , Point p1 )
        {
            if ( Text.Length==0 )
                return;
            G.DrawString (Text , Font , b1 , p1);
        }
        protected void DrawText( Brush b1 , int x , int y )
        {
            if ( Text.Length==0 )
                return;
            G.DrawString (Text , Font , b1 , x , y);
        }

        #endregion

        #region " DrawImage "


        private Point DrawImagePoint;
        protected void DrawImage( HorizontalAlignment a , int x , int y )
        {
            DrawImage (_Image , a , x , y);
        }
        protected void DrawImage( Image image , HorizontalAlignment a , int x , int y )
        {
            if ( image==null )
                return;
            DrawImagePoint=new Point (Width/2-image.Width/2 , Header/2-image.Height/2);

            switch ( a )
            {
                case HorizontalAlignment.Left:
                    G.DrawImage (image , x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
                case HorizontalAlignment.Center:
                    G.DrawImage (image , DrawImagePoint.X+x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
                case HorizontalAlignment.Right:
                    G.DrawImage (image , Width-image.Width-x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
            }
        }

        protected void DrawImage( Point p1 )
        {
            DrawImage (_Image , p1.X , p1.Y);
        }
        protected void DrawImage( int x , int y )
        {
            DrawImage (_Image , x , y);
        }

        protected void DrawImage( Image image , Point p1 )
        {
            DrawImage (image , p1.X , p1.Y);
        }
        protected void DrawImage( Image image , int x , int y )
        {
            if ( image==null )
                return;
            G.DrawImage (image , x , y , image.Width , image.Height);
        }

        #endregion

        #region " DrawGradient "

        private LinearGradientBrush DrawGradientBrush;

        private Rectangle DrawGradientRectangle;
        protected void DrawGradient( ColorBlend blend , int x , int y , int width , int height )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (blend , DrawGradientRectangle);
        }
        protected void DrawGradient( ColorBlend blend , int x , int y , int width , int height , float angle )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (blend , DrawGradientRectangle , angle);
        }

        protected void DrawGradient( ColorBlend blend , Rectangle r )
        {
            DrawGradientBrush=new LinearGradientBrush (r , Color.Empty , Color.Empty , 90f);
            DrawGradientBrush.InterpolationColors=blend;
            G.FillRectangle (DrawGradientBrush , r);
        }
        protected void DrawGradient( ColorBlend blend , Rectangle r , float angle )
        {
            DrawGradientBrush=new LinearGradientBrush (r , Color.Empty , Color.Empty , angle);
            DrawGradientBrush.InterpolationColors=blend;
            G.FillRectangle (DrawGradientBrush , r);
        }


        protected void DrawGradient( Color c1 , Color c2 , int x , int y , int width , int height )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (c1 , c2 , DrawGradientRectangle);
        }
        protected void DrawGradient( Color c1 , Color c2 , int x , int y , int width , int height , float angle )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (c1 , c2 , DrawGradientRectangle , angle);
        }

        protected void DrawGradient( Color c1 , Color c2 , Rectangle r )
        {
            DrawGradientBrush=new LinearGradientBrush (r , c1 , c2 , 90f);
            G.FillRectangle (DrawGradientBrush , r);
        }
        protected void DrawGradient( Color c1 , Color c2 , Rectangle r , float angle )
        {
            DrawGradientBrush=new LinearGradientBrush (r , c1 , c2 , angle);
            G.FillRectangle (DrawGradientBrush , r);
        }

        #endregion

        #region " DrawRadial "

        private GraphicsPath DrawRadialPath;
        private PathGradientBrush DrawRadialBrush1;
        private LinearGradientBrush DrawRadialBrush2;

        private Rectangle DrawRadialRectangle;
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , width/2 , height/2);
        }
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height , Point center )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , center.X , center.Y);
        }
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height , int cx , int cy )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , cx , cy);
        }

        public void DrawRadial( ColorBlend blend , Rectangle r )
        {
            DrawRadial (blend , r , r.Width/2 , r.Height/2);
        }
        public void DrawRadial( ColorBlend blend , Rectangle r , Point center )
        {
            DrawRadial (blend , r , center.X , center.Y);
        }
        public void DrawRadial( ColorBlend blend , Rectangle r , int cx , int cy )
        {
            DrawRadialPath.Reset ();
            DrawRadialPath.AddEllipse (r.X , r.Y , r.Width-1 , r.Height-1);

            DrawRadialBrush1=new PathGradientBrush (DrawRadialPath);
            DrawRadialBrush1.CenterPoint=new Point (r.X+cx , r.Y+cy);
            DrawRadialBrush1.InterpolationColors=blend;

            if ( G.SmoothingMode==SmoothingMode.AntiAlias )
            {
                G.FillEllipse (DrawRadialBrush1 , r.X+1 , r.Y+1 , r.Width-3 , r.Height-3);
            }
            else
            {
                G.FillEllipse (DrawRadialBrush1 , r);
            }
        }


        protected void DrawRadial( Color c1 , Color c2 , int x , int y , int width , int height )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (c1 , c2 , DrawGradientRectangle);
        }
        protected void DrawRadial( Color c1 , Color c2 , int x , int y , int width , int height , float angle )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (c1 , c2 , DrawGradientRectangle , angle);
        }

        protected void DrawRadial( Color c1 , Color c2 , Rectangle r )
        {
            DrawRadialBrush2=new LinearGradientBrush (r , c1 , c2 , 90f);
            G.FillRectangle (DrawGradientBrush , r);
        }
        protected void DrawRadial( Color c1 , Color c2 , Rectangle r , float angle )
        {
            DrawRadialBrush2=new LinearGradientBrush (r , c1 , c2 , angle);
            G.FillEllipse (DrawGradientBrush , r);
        }

        #endregion

        #region " CreateRound "

        private GraphicsPath CreateRoundPath;

        private Rectangle CreateRoundRectangle;
        public GraphicsPath CreateRound( int x , int y , int width , int height , int slope )
        {
            CreateRoundRectangle=new Rectangle (x , y , width , height);
            return CreateRound (CreateRoundRectangle , slope);
        }

        public GraphicsPath CreateRound( Rectangle r , int slope )
        {
            CreateRoundPath=new GraphicsPath (FillMode.Winding);
            CreateRoundPath.AddArc (r.X , r.Y , slope , slope , 180f , 90f);
            CreateRoundPath.AddArc (r.Right-slope , r.Y , slope , slope , 270f , 90f);
            CreateRoundPath.AddArc (r.Right-slope , r.Bottom-slope , slope , slope , 0f , 90f);
            CreateRoundPath.AddArc (r.X , r.Bottom-slope , slope , slope , 90f , 90f);
            CreateRoundPath.CloseFigure ();
            return CreateRoundPath;
        }

        #endregion

    }

    abstract class ThemeControl154: Control
    {


        #region " Initialization "

        protected Graphics G;

        protected Bitmap B;
        public ThemeControl154()
        {
            SetStyle ((ControlStyles)139270 , true);

            _ImageSize=Size.Empty;
            Font=new Font ("Verdana" , 8);

            MeasureBitmap=new Bitmap (1 , 1);
            MeasureGraphics=Graphics.FromImage (MeasureBitmap);

            DrawRadialPath=new GraphicsPath ();

            InvalidateCustimization ();
            //Remove?
        }

        protected override sealed void OnHandleCreated( EventArgs e )
        {
            InvalidateCustimization ();
            ColorHook ();

            if ( !( _LockWidth==0 ) )
                Width=_LockWidth;
            if ( !( _LockHeight==0 ) )
                Height=_LockHeight;

            Transparent=_Transparent;
            if ( _Transparent&&_BackColor )
                BackColor=Color.Transparent;

            base.OnHandleCreated (e);
        }

        private bool DoneCreation;
        protected override sealed void OnParentChanged( EventArgs e )
        {
            if ( Parent!=null )
            {
                OnCreation ();
                DoneCreation=true;
                InvalidateTimer ();
            }

            base.OnParentChanged (e);
        }

        #endregion

        private void DoAnimation( bool i )
        {
            OnAnimation ();
            if ( i )
                Invalidate ();
        }

        protected override sealed void OnPaint( PaintEventArgs e )
        {
            if ( Width==0||Height==0 )
                return;

            if ( _Transparent )
            {
                PaintHook ();
                e.Graphics.DrawImage (B , 0 , 0);
            }
            else
            {
                G=e.Graphics;
                PaintHook ();
            }
        }

        protected override void OnHandleDestroyed( EventArgs e )
        {
            ThemeShare.RemoveAnimationCallback (DoAnimation);
            base.OnHandleDestroyed (e);
        }

        #region " Size Handling "

        protected override sealed void OnSizeChanged( EventArgs e )
        {
            if ( _Transparent )
            {
                InvalidateBitmap ();
            }

            Invalidate ();
            base.OnSizeChanged (e);
        }

        protected override void SetBoundsCore( int x , int y , int width , int height , BoundsSpecified specified )
        {
            if ( !( _LockWidth==0 ) )
                width=_LockWidth;
            if ( !( _LockHeight==0 ) )
                height=_LockHeight;
            base.SetBoundsCore (x , y , width , height , specified);
        }

        #endregion

        #region " State Handling "

        private bool InPosition;
        protected override void OnMouseEnter( EventArgs e )
        {
            InPosition=true;
            SetState (MouseState.Over);
            base.OnMouseEnter (e);
        }

        protected override void OnMouseUp( MouseEventArgs e )
        {
            if ( InPosition )
                SetState (MouseState.Over);
            base.OnMouseUp (e);
        }

        protected override void OnMouseDown( MouseEventArgs e )
        {
            if ( e.Button==System.Windows.Forms.MouseButtons.Left )
                SetState (MouseState.Down);
            base.OnMouseDown (e);
        }

        protected override void OnMouseLeave( EventArgs e )
        {
            InPosition=false;
            SetState (MouseState.None);
            base.OnMouseLeave (e);
        }

        protected override void OnEnabledChanged( EventArgs e )
        {
            if ( Enabled )
                SetState (MouseState.None);
            else
                SetState (MouseState.Block);
            base.OnEnabledChanged (e);
        }

        protected MouseState State;
        private void SetState( MouseState current )
        {
            State=current;
            Invalidate ();
        }

        #endregion


        #region " Base Properties "

        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override Color ForeColor
        {
            get { return Color.Empty; }
            set { }
        }
        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override Image BackgroundImage
        {
            get { return null; }
            set { }
        }
        [Browsable (false), EditorBrowsable (EditorBrowsableState.Never), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
        public override ImageLayout BackgroundImageLayout
        {
            get { return ImageLayout.None; }
            set { }
        }

        public override string Text
        {
            get { return base.Text; }
            set
            {
                base.Text=value;
                Invalidate ();
            }
        }
        public override Font Font
        {
            get { return base.Font; }
            set
            {
                base.Font=value;
                Invalidate ();
            }
        }

        private bool _BackColor;
        [Category ("Misc")]
        public override Color BackColor
        {
            get { return base.BackColor; }
            set
            {
                if ( !IsHandleCreated&&value==Color.Transparent )
                {
                    _BackColor=true;
                    return;
                }

                base.BackColor=value;
                if ( Parent!=null )
                    ColorHook ();
            }
        }

        #endregion

        #region " Public Properties "

        private bool _NoRounding;
        public bool NoRounding
        {
            get { return _NoRounding; }
            set
            {
                _NoRounding=value;
                Invalidate ();
            }
        }

        private Image _Image;
        public Image Image
        {
            get { return _Image; }
            set
            {
                if ( value==null )
                {
                    _ImageSize=Size.Empty;
                }
                else
                {
                    _ImageSize=value.Size;
                }

                _Image=value;
                Invalidate ();
            }
        }

        private bool _Transparent;
        public bool Transparent
        {
            get { return _Transparent; }
            set
            {
                _Transparent=value;
                if ( !IsHandleCreated )
                    return;

                if ( !value&&!( BackColor.A==255 ) )
                {
                    throw new Exception ("Unable to change value to false while a transparent BackColor is in use.");
                }

                SetStyle (ControlStyles.Opaque , !value);
                SetStyle (ControlStyles.SupportsTransparentBackColor , value);

                if ( value )
                    InvalidateBitmap ();
                else
                    B=null;
                Invalidate ();
            }
        }

        private Dictionary<string , Color> Items = new Dictionary<string , Color> ();
        public Bloom[] Colors
        {
            get
            {
                List<Bloom> T = new List<Bloom> ();
                Dictionary<string , Color>.Enumerator E = Items.GetEnumerator ();

                while ( E.MoveNext () )
                {
                    T.Add (new Bloom (E.Current.Key , E.Current.Value));
                }

                return T.ToArray ();
            }
            set
            {
                foreach ( Bloom B in value )
                {
                    if ( Items.ContainsKey (B.Name) )
                        Items[ B.Name ]=B.Value;
                }

                InvalidateCustimization ();
                ColorHook ();
                Invalidate ();
            }
        }

        private string _Customization;
        public string Customization
        {
            get { return _Customization; }
            set
            {
                if ( value==_Customization )
                    return;

                byte[] Data = null;
                Bloom[] Items = Colors;

                try
                {
                    Data=Convert.FromBase64String (value);
                    for ( int I = 0; I<=Items.Length-1; I++ )
                    {
                        Items[ I ].Value=Color.FromArgb (BitConverter.ToInt32 (Data , I*4));
                    }
                }
                catch
                {
                    return;
                }

                _Customization=value;

                Colors=Items;
                ColorHook ();
                Invalidate ();
            }
        }

        #endregion

        #region " Private Properties "

        private Size _ImageSize;
        protected Size ImageSize
        {
            get { return _ImageSize; }
        }

        private int _LockWidth;
        protected int LockWidth
        {
            get { return _LockWidth; }
            set
            {
                _LockWidth=value;
                if ( !( LockWidth==0 )&&IsHandleCreated )
                    Width=LockWidth;
            }
        }

        private int _LockHeight;
        protected int LockHeight
        {
            get { return _LockHeight; }
            set
            {
                _LockHeight=value;
                if ( !( LockHeight==0 )&&IsHandleCreated )
                    Height=LockHeight;
            }
        }

        private bool _IsAnimated;
        protected bool IsAnimated
        {
            get { return _IsAnimated; }
            set
            {
                _IsAnimated=value;
                InvalidateTimer ();
            }
        }

        #endregion


        #region " Property Helpers "

        protected Pen GetPen( string name )
        {
            return new Pen (Items[ name ]);
        }
        protected Pen GetPen( string name , float width )
        {
            return new Pen (Items[ name ] , width);
        }

        protected SolidBrush GetBrush( string name )
        {
            return new SolidBrush (Items[ name ]);
        }

        protected Color GetColor( string name )
        {
            return Items[ name ];
        }

        protected void SetColor( string name , Color value )
        {
            if ( Items.ContainsKey (name) )
                Items[ name ]=value;
            else
                Items.Add (name , value);
        }
        protected void SetColor( string name , byte r , byte g , byte b )
        {
            SetColor (name , Color.FromArgb (r , g , b));
        }
        protected void SetColor( string name , byte a , byte r , byte g , byte b )
        {
            SetColor (name , Color.FromArgb (a , r , g , b));
        }
        protected void SetColor( string name , byte a , Color value )
        {
            SetColor (name , Color.FromArgb (a , value));
        }

        private void InvalidateBitmap()
        {
            if ( Width==0||Height==0 )
                return;
            B=new Bitmap (Width , Height , PixelFormat.Format32bppPArgb);
            G=Graphics.FromImage (B);
        }

        private void InvalidateCustimization()
        {
            MemoryStream M = new MemoryStream (Items.Count*4);

            foreach ( Bloom B in Colors )
            {
                M.Write (BitConverter.GetBytes (B.Value.ToArgb ()) , 0 , 4);
            }

            M.Close ();
            _Customization=Convert.ToBase64String (M.ToArray ());
        }

        private void InvalidateTimer()
        {
            if ( DesignMode||!DoneCreation )
                return;

            if ( _IsAnimated )
            {
                ThemeShare.AddAnimationCallback (DoAnimation);
            }
            else
            {
                ThemeShare.RemoveAnimationCallback (DoAnimation);
            }
        }
        #endregion


        #region " User Hooks "

        protected abstract void ColorHook();
        protected abstract void PaintHook();

        protected virtual void OnCreation()
        {
        }

        protected virtual void OnAnimation()
        {
        }

        #endregion


        #region " Offset "

        private Rectangle OffsetReturnRectangle;
        protected Rectangle Offset( Rectangle r , int amount )
        {
            OffsetReturnRectangle=new Rectangle (r.X+amount , r.Y+amount , r.Width-( amount*2 ) , r.Height-( amount*2 ));
            return OffsetReturnRectangle;
        }

        private Size OffsetReturnSize;
        protected Size Offset( Size s , int amount )
        {
            OffsetReturnSize=new Size (s.Width+amount , s.Height+amount);
            return OffsetReturnSize;
        }

        private Point OffsetReturnPoint;
        protected Point Offset( Point p , int amount )
        {
            OffsetReturnPoint=new Point (p.X+amount , p.Y+amount);
            return OffsetReturnPoint;
        }

        #endregion

        #region " Center "


        private Point CenterReturn;
        protected Point Center( Rectangle p , Rectangle c )
        {
            CenterReturn=new Point (( p.Width/2-c.Width/2 )+p.X+c.X , ( p.Height/2-c.Height/2 )+p.Y+c.Y);
            return CenterReturn;
        }
        protected Point Center( Rectangle p , Size c )
        {
            CenterReturn=new Point (( p.Width/2-c.Width/2 )+p.X , ( p.Height/2-c.Height/2 )+p.Y);
            return CenterReturn;
        }

        protected Point Center( Rectangle child )
        {
            return Center (Width , Height , child.Width , child.Height);
        }
        protected Point Center( Size child )
        {
            return Center (Width , Height , child.Width , child.Height);
        }
        protected Point Center( int childWidth , int childHeight )
        {
            return Center (Width , Height , childWidth , childHeight);
        }

        protected Point Center( Size p , Size c )
        {
            return Center (p.Width , p.Height , c.Width , c.Height);
        }

        protected Point Center( int pWidth , int pHeight , int cWidth , int cHeight )
        {
            CenterReturn=new Point (pWidth/2-cWidth/2 , pHeight/2-cHeight/2);
            return CenterReturn;
        }

        #endregion

        #region " Measure "

        private Bitmap MeasureBitmap;
        //TODO: Potential issues during multi-threading.
        private Graphics MeasureGraphics;

        protected Size Measure()
        {
            return MeasureGraphics.MeasureString (Text , Font , Width).ToSize ();
        }
        protected Size Measure( string text )
        {
            return MeasureGraphics.MeasureString (text , Font , Width).ToSize ();
        }

        #endregion


        #region " DrawPixel "


        private SolidBrush DrawPixelBrush;
        protected void DrawPixel( Color c1 , int x , int y )
        {
            if ( _Transparent )
            {
                B.SetPixel (x , y , c1);
            }
            else
            {
                DrawPixelBrush=new SolidBrush (c1);
                G.FillRectangle (DrawPixelBrush , x , y , 1 , 1);
            }
        }

        #endregion

        #region " DrawCorners "


        private SolidBrush DrawCornersBrush;
        protected void DrawCorners( Color c1 , int offset )
        {
            DrawCorners (c1 , 0 , 0 , Width , Height , offset);
        }
        protected void DrawCorners( Color c1 , Rectangle r1 , int offset )
        {
            DrawCorners (c1 , r1.X , r1.Y , r1.Width , r1.Height , offset);
        }
        protected void DrawCorners( Color c1 , int x , int y , int width , int height , int offset )
        {
            DrawCorners (c1 , x+offset , y+offset , width-( offset*2 ) , height-( offset*2 ));
        }

        protected void DrawCorners( Color c1 )
        {
            DrawCorners (c1 , 0 , 0 , Width , Height);
        }
        protected void DrawCorners( Color c1 , Rectangle r1 )
        {
            DrawCorners (c1 , r1.X , r1.Y , r1.Width , r1.Height);
        }
        protected void DrawCorners( Color c1 , int x , int y , int width , int height )
        {
            if ( _NoRounding )
                return;

            if ( _Transparent )
            {
                B.SetPixel (x , y , c1);
                B.SetPixel (x+( width-1 ) , y , c1);
                B.SetPixel (x , y+( height-1 ) , c1);
                B.SetPixel (x+( width-1 ) , y+( height-1 ) , c1);
            }
            else
            {
                DrawCornersBrush=new SolidBrush (c1);
                G.FillRectangle (DrawCornersBrush , x , y , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x+( width-1 ) , y , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x , y+( height-1 ) , 1 , 1);
                G.FillRectangle (DrawCornersBrush , x+( width-1 ) , y+( height-1 ) , 1 , 1);
            }
        }

        #endregion

        #region " DrawBorders "

        protected void DrawBorders( Pen p1 , int offset )
        {
            DrawBorders (p1 , 0 , 0 , Width , Height , offset);
        }
        protected void DrawBorders( Pen p1 , Rectangle r , int offset )
        {
            DrawBorders (p1 , r.X , r.Y , r.Width , r.Height , offset);
        }
        protected void DrawBorders( Pen p1 , int x , int y , int width , int height , int offset )
        {
            DrawBorders (p1 , x+offset , y+offset , width-( offset*2 ) , height-( offset*2 ));
        }

        protected void DrawBorders( Pen p1 )
        {
            DrawBorders (p1 , 0 , 0 , Width , Height);
        }
        protected void DrawBorders( Pen p1 , Rectangle r )
        {
            DrawBorders (p1 , r.X , r.Y , r.Width , r.Height);
        }
        protected void DrawBorders( Pen p1 , int x , int y , int width , int height )
        {
            G.DrawRectangle (p1 , x , y , width-1 , height-1);
        }

        #endregion

        #region " DrawText "

        private Point DrawTextPoint;

        private Size DrawTextSize;
        protected void DrawText( Brush b1 , HorizontalAlignment a , int x , int y )
        {
            DrawText (b1 , Text , a , x , y);
        }
        protected void DrawText( Brush b1 , string text , HorizontalAlignment a , int x , int y )
        {
            if ( text.Length==0 )
                return;

            DrawTextSize=Measure (text);
            DrawTextPoint=Center (DrawTextSize);

            switch ( a )
            {
                case HorizontalAlignment.Left:
                    G.DrawString (text , Font , b1 , x , DrawTextPoint.Y+y);
                    break;
                case HorizontalAlignment.Center:
                    G.DrawString (text , Font , b1 , DrawTextPoint.X+x , DrawTextPoint.Y+y);
                    break;
                case HorizontalAlignment.Right:
                    G.DrawString (text , Font , b1 , Width-DrawTextSize.Width-x , DrawTextPoint.Y+y);
                    break;
            }
        }

        protected void DrawText( Brush b1 , Point p1 )
        {
            if ( Text.Length==0 )
                return;
            G.DrawString (Text , Font , b1 , p1);
        }
        protected void DrawText( Brush b1 , int x , int y )
        {
            if ( Text.Length==0 )
                return;
            G.DrawString (Text , Font , b1 , x , y);
        }

        #endregion

        #region " DrawImage "


        private Point DrawImagePoint;
        protected void DrawImage( HorizontalAlignment a , int x , int y )
        {
            DrawImage (_Image , a , x , y);
        }
        protected void DrawImage( Image image , HorizontalAlignment a , int x , int y )
        {
            if ( image==null )
                return;
            DrawImagePoint=Center (image.Size);

            switch ( a )
            {
                case HorizontalAlignment.Left:
                    G.DrawImage (image , x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
                case HorizontalAlignment.Center:
                    G.DrawImage (image , DrawImagePoint.X+x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
                case HorizontalAlignment.Right:
                    G.DrawImage (image , Width-image.Width-x , DrawImagePoint.Y+y , image.Width , image.Height);
                    break;
            }
        }

        protected void DrawImage( Point p1 )
        {
            DrawImage (_Image , p1.X , p1.Y);
        }
        protected void DrawImage( int x , int y )
        {
            DrawImage (_Image , x , y);
        }

        protected void DrawImage( Image image , Point p1 )
        {
            DrawImage (image , p1.X , p1.Y);
        }
        protected void DrawImage( Image image , int x , int y )
        {
            if ( image==null )
                return;
            G.DrawImage (image , x , y , image.Width , image.Height);
        }

        #endregion

        #region " DrawGradient "

        private LinearGradientBrush DrawGradientBrush;

        private Rectangle DrawGradientRectangle;
        protected void DrawGradient( ColorBlend blend , int x , int y , int width , int height )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (blend , DrawGradientRectangle);
        }
        protected void DrawGradient( ColorBlend blend , int x , int y , int width , int height , float angle )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (blend , DrawGradientRectangle , angle);
        }

        protected void DrawGradient( ColorBlend blend , Rectangle r )
        {
            DrawGradientBrush=new LinearGradientBrush (r , Color.Empty , Color.Empty , 90f);
            DrawGradientBrush.InterpolationColors=blend;
            G.FillRectangle (DrawGradientBrush , r);
        }
        protected void DrawGradient( ColorBlend blend , Rectangle r , float angle )
        {
            DrawGradientBrush=new LinearGradientBrush (r , Color.Empty , Color.Empty , angle);
            DrawGradientBrush.InterpolationColors=blend;
            G.FillRectangle (DrawGradientBrush , r);
        }


        protected void DrawGradient( Color c1 , Color c2 , int x , int y , int width , int height )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (c1 , c2 , DrawGradientRectangle);
        }
        protected void DrawGradient( Color c1 , Color c2 , int x , int y , int width , int height , float angle )
        {
            DrawGradientRectangle=new Rectangle (x , y , width , height);
            DrawGradient (c1 , c2 , DrawGradientRectangle , angle);
        }

        protected void DrawGradient( Color c1 , Color c2 , Rectangle r )
        {
            DrawGradientBrush=new LinearGradientBrush (r , c1 , c2 , 90f);
            G.FillRectangle (DrawGradientBrush , r);
        }
        protected void DrawGradient( Color c1 , Color c2 , Rectangle r , float angle )
        {
            DrawGradientBrush=new LinearGradientBrush (r , c1 , c2 , angle);
            G.FillRectangle (DrawGradientBrush , r);
        }

        #endregion

        #region " DrawRadial "

        private GraphicsPath DrawRadialPath;
        private PathGradientBrush DrawRadialBrush1;
        private LinearGradientBrush DrawRadialBrush2;

        private Rectangle DrawRadialRectangle;
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , width/2 , height/2);
        }
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height , Point center )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , center.X , center.Y);
        }
        public void DrawRadial( ColorBlend blend , int x , int y , int width , int height , int cx , int cy )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (blend , DrawRadialRectangle , cx , cy);
        }

        public void DrawRadial( ColorBlend blend , Rectangle r )
        {
            DrawRadial (blend , r , r.Width/2 , r.Height/2);
        }
        public void DrawRadial( ColorBlend blend , Rectangle r , Point center )
        {
            DrawRadial (blend , r , center.X , center.Y);
        }
        public void DrawRadial( ColorBlend blend , Rectangle r , int cx , int cy )
        {
            DrawRadialPath.Reset ();
            DrawRadialPath.AddEllipse (r.X , r.Y , r.Width-1 , r.Height-1);

            DrawRadialBrush1=new PathGradientBrush (DrawRadialPath);
            DrawRadialBrush1.CenterPoint=new Point (r.X+cx , r.Y+cy);
            DrawRadialBrush1.InterpolationColors=blend;

            if ( G.SmoothingMode==SmoothingMode.AntiAlias )
            {
                G.FillEllipse (DrawRadialBrush1 , r.X+1 , r.Y+1 , r.Width-3 , r.Height-3);
            }
            else
            {
                G.FillEllipse (DrawRadialBrush1 , r);
            }
        }


        protected void DrawRadial( Color c1 , Color c2 , int x , int y , int width , int height )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (c1 , c2 , DrawRadialRectangle);
        }
        protected void DrawRadial( Color c1 , Color c2 , int x , int y , int width , int height , float angle )
        {
            DrawRadialRectangle=new Rectangle (x , y , width , height);
            DrawRadial (c1 , c2 , DrawRadialRectangle , angle);
        }

        protected void DrawRadial( Color c1 , Color c2 , Rectangle r )
        {
            DrawRadialBrush2=new LinearGradientBrush (r , c1 , c2 , 90f);
            G.FillEllipse (DrawRadialBrush2 , r);
        }
        protected void DrawRadial( Color c1 , Color c2 , Rectangle r , float angle )
        {
            DrawRadialBrush2=new LinearGradientBrush (r , c1 , c2 , angle);
            G.FillEllipse (DrawRadialBrush2 , r);
        }

        #endregion

        #region " CreateRound "

        private GraphicsPath CreateRoundPath;

        private Rectangle CreateRoundRectangle;
        public GraphicsPath CreateRound( int x , int y , int width , int height , int slope )
        {
            CreateRoundRectangle=new Rectangle (x , y , width , height);
            return CreateRound (CreateRoundRectangle , slope);
        }

        public GraphicsPath CreateRound( Rectangle r , int slope )
        {
            CreateRoundPath=new GraphicsPath (FillMode.Winding);
            CreateRoundPath.AddArc (r.X , r.Y , slope , slope , 180f , 90f);
            CreateRoundPath.AddArc (r.Right-slope , r.Y , slope , slope , 270f , 90f);
            CreateRoundPath.AddArc (r.Right-slope , r.Bottom-slope , slope , slope , 0f , 90f);
            CreateRoundPath.AddArc (r.X , r.Bottom-slope , slope , slope , 90f , 90f);
            CreateRoundPath.CloseFigure ();
            return CreateRoundPath;
        }

        #endregion

    }

    static class ThemeShare
    {

        #region " Animation "

        private static int Frames;
        private static bool Invalidate;

        public static PrecisionTimer ThemeTimer = new PrecisionTimer ();
        //1000 / 50 = 20 FPS
        private const int FPS = 50;

        private const int Rate = 10;
        public delegate void AnimationDelegate( bool invalidate );


        private static List<AnimationDelegate> Callbacks = new List<AnimationDelegate> ();
        private static void HandleCallbacks( IntPtr state , bool reserve )
        {
            Invalidate=( Frames>=FPS );
            if ( Invalidate )
                Frames=0;

            lock ( Callbacks )
            {
                for ( int I = 0; I<=Callbacks.Count-1; I++ )
                {
                    Callbacks[ I ].Invoke (Invalidate);
                }
            }

            Frames+=Rate;
        }

        private static void InvalidateThemeTimer()
        {
            if ( Callbacks.Count==0 )
            {
                ThemeTimer.Delete ();
            }
            else
            {
                ThemeTimer.Create (0 , Rate , HandleCallbacks);
            }
        }

        public static void AddAnimationCallback( AnimationDelegate callback )
        {
            lock ( Callbacks )
            {
                if ( Callbacks.Contains (callback) )
                    return;

                Callbacks.Add (callback);
                InvalidateThemeTimer ();
            }
        }

        public static void RemoveAnimationCallback( AnimationDelegate callback )
        {
            lock ( Callbacks )
            {
                if ( !Callbacks.Contains (callback) )
                    return;

                Callbacks.Remove (callback);
                InvalidateThemeTimer ();
            }
        }

        #endregion

    }

    enum MouseState: byte
    {
        None = 0,
        Over = 1,
        Down = 2,
        Block = 3
    }

    struct Bloom
    {

        public string _Name;
        public string Name
        {
            get { return _Name; }
        }

        private Color _Value;
        public Color Value
        {
            get { return _Value; }
            set { _Value=value; }
        }

        public string ValueHex
        {
            get { return string.Concat ("#" , _Value.R.ToString ("X2" , null) , _Value.G.ToString ("X2" , null) , _Value.B.ToString ("X2" , null)); }
            set
            {
                try
                {
                    _Value=ColorTranslator.FromHtml (value);
                }
                catch
                {
                    return;
                }
            }
        }


        public Bloom( string name , Color value )
        {
            _Name=name;
            _Value=value;
        }
    }

    //------------------
    //Creator: aeonhack
    //Site: elitevs.net
    //Created: 11/30/2011
    //Changed: 11/30/2011
    //Version: 1.0.0
    //------------------
    class PrecisionTimer: IDisposable
    {

        private bool _Enabled;
        public bool Enabled
        {
            get { return _Enabled; }
        }

        private IntPtr Handle;

        private TimerDelegate TimerCallback;
        [DllImport ("kernel32.dll" , EntryPoint = "CreateTimerQueueTimer")]
        private static extern bool CreateTimerQueueTimer( ref IntPtr handle , IntPtr queue , TimerDelegate callback , IntPtr state , uint dueTime , uint period , uint flags );

        [DllImport ("kernel32.dll" , EntryPoint = "DeleteTimerQueueTimer")]
        private static extern bool DeleteTimerQueueTimer( IntPtr queue , IntPtr handle , IntPtr callback );

        public delegate void TimerDelegate( IntPtr r1 , bool r2 );

        public void Create( uint dueTime , uint period , TimerDelegate callback )
        {
            if ( _Enabled )
                return;

            TimerCallback=callback;
            bool Success = CreateTimerQueueTimer (ref Handle , IntPtr.Zero , TimerCallback , IntPtr.Zero , dueTime , period , 0);

            if ( !Success )
                ThrowNewException ("CreateTimerQueueTimer");
            _Enabled=Success;
        }

        public void Delete()
        {
            if ( !_Enabled )
                return;
            bool Success = DeleteTimerQueueTimer (IntPtr.Zero , Handle , IntPtr.Zero);

            if ( !Success&&!( Marshal.GetLastWin32Error ()==997 ) )
            {
                ThrowNewException ("DeleteTimerQueueTimer");
            }

            _Enabled=!Success;
        }

        private void ThrowNewException( string name )
        {
            throw new Exception (string.Format ("{0} failed. Win32Error: {1}" , name , Marshal.GetLastWin32Error ()));
        }

        public void Dispose()
        {
            Delete ();
        }
    }


    class CheckBox: ThemeControl154
    {
        bool isChecked;

        public bool Checked
        {
            get { return isChecked; }
            set { isChecked=value; this.Invalidate (); }
        }
        protected override void ColorHook()
        {
        }

        protected override void PaintHook()
        {
            G.Clear (Color.White);
            if(Checked)
            {
                DrawImage (Properties.Resources.checkboxchecked , 2 , 2);
            }
            else
            {
                DrawImage (Properties.Resources.checkboxunchecked, 2 , 2);
            }
            DrawText (new SolidBrush (Color.Black) , HorizontalAlignment.Left , 25 , -2);
        }

        protected override void OnClick( EventArgs e )
        {
            this.Checked=!this.Checked;
            base.OnClick (e);
        }
    }
}